/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.sistemas.beans;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.cip.esymons.sistemas.bc.galeriaDelegate;
import org.cip.esymons.sistemas.be.SisGaleria;

/**
 *
 * @author WILLIAM
 */
public class galeriaController {

    private galeriaDelegate delegadoGaleria;
    private SisGaleria galeria;

    List<SisGaleria> listaFotos;
    List<SisGaleria> listaAdjuntos;

    private Integer cantidad,vista;
    private Boolean activar;

    public galeriaController() {

        delegadoGaleria = new galeriaDelegate();

        galeria = new SisGaleria();

        listaFotos = new ArrayList<SisGaleria>();
        listaAdjuntos = new ArrayList<SisGaleria>();

        activar = false;
        vista = 1;

    }

    public Integer getVista() {
        return vista;
    }

    public void setVista(Integer vista) {
        this.vista = vista;
    }

    public List<SisGaleria> getListaAdjuntos() {
        return listaAdjuntos;
    }

    public void setListaAdjuntos(List<SisGaleria> listaAdjuntos) {
        this.listaAdjuntos = listaAdjuntos;
    }

    public List<SisGaleria> getListaFotos() {
        return listaFotos;
    }

    public void setListaFotos(List<SisGaleria> listaFotos) {
        this.listaFotos = listaFotos;
    }

    public Boolean getActivar() {
        return activar;
    }

    public void setActivar(Boolean activar) {
        this.activar = activar;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public galeriaDelegate getDelegadoGaleria() {
        return delegadoGaleria;
    }

    public void setDelegadoGaleria(galeriaDelegate delegadoGaleria) {
        this.delegadoGaleria = delegadoGaleria;
    }

    public SisGaleria getGaleria() {
        return galeria;
    }

    public void setGaleria(SisGaleria galeria) {
        this.galeria = galeria;
    }

    public String nuevo(){

        galeria = new SisGaleria();

        return "ir_a_nuevo";
    }

    public String editar(){

        return "ir_a_editar";
    }

    public String remover(){

        delegadoGaleria.remove(galeria);
        listaAdjuntos.remove(galeria);
        galeria =  new SisGaleria();
        getlistarImagenAdjunta();

        return null;
    }

    public String cancelar(){

        galeria = new SisGaleria();
        listaAdjuntos = new ArrayList<SisGaleria>();
        activar = false;

        return null;
    }    

    public List<SisGaleria> getlistaImagenes(){

        listaFotos = new ArrayList<SisGaleria>();
        listaFotos = delegadoGaleria.findAll();
        cantidad = listaFotos.size();

        return listaFotos;
    }


    public void drawImagenListaFotos(OutputStream output, Object object) throws IOException{

        SisGaleria galera = new SisGaleria();

        try {
             Integer index = new Integer(object.toString());
             galera = listaFotos.get(index);
             File file = new File(galera.getGalRuta());
             FileInputStream inputStream = new FileInputStream(file);
             int tamañoInput = inputStream.available();
             byte[] datos = new byte[tamañoInput];
             inputStream.read(datos, 0, tamañoInput);
             output.write(datos, 0, tamañoInput);

        } catch (Exception e) {

        }
    }

    // subir archivo

    private UploadedFile upFile;
    boolean rendSuccess = false;
    boolean rendFailure = false;
    private String dirImagen;

    public boolean isRendFailure() {
        return rendFailure;
    }

    public void setRendFailure(boolean rendFailure) {
        this.rendFailure = rendFailure;
    }

    public boolean isRendSuccess() {
        return rendSuccess;
    }

    public void setRendSuccess(boolean rendSuccess) {
        this.rendSuccess = rendSuccess;
    }

    public UploadedFile getUpFile() {
        return upFile;
    }

    public void setUpFile(UploadedFile upFile) {
        this.upFile = upFile;
    }

    public String getDirImagen() {
        return dirImagen;
    }

    public void setDirImagen(String dirImagen) {
        this.dirImagen = dirImagen;
    }

    public String upload() throws IOException {
            
        try {
            dirImagen = "D:\\Archivos\\";
            String extension = "";

            extension = upFile.getName().substring(upFile.getName().length()-4,upFile.getName().length());
            InputStream stream = upFile.getInputStream();

            dirImagen = dirImagen.concat(galeria.getGalNombre().concat(extension));
            OutputStream out = new FileOutputStream(dirImagen);
            long size = upFile.getSize();
            byte[] buffer = new byte[(int) size];
            stream.read(buffer, 0, (int) size);
            out.write(buffer, 0, (int) size);
            stream.close();
            out.close();
            redimensionaJPG(dirImagen, dirImagen);
            grabar();
            rendSuccess = true;
            rendFailure = false;
            System.out.println("File Upload Successful.");
            return "ok";

        } catch (Exception ioe) {
            System.out.println("File Upload Unsuccessful.");
            System.out.println("errorrrr" + ioe.toString());
            rendSuccess = false;
            rendFailure = true;
            return "no";
        }
    }

    public String grabar(){

        try {
            galeria.setGalFecharegistro(new Date());
            galeria.setGalRuta(dirImagen);
            delegadoGaleria.create(galeria);
            agregarAdjunto();

            mostrarMensaje("INFO: ", "Imagen cargada satisfactoriamente...", FacesMessage.SEVERITY_INFO);

        } catch (Exception ex) {
            System.out.println("Error: "+ex.getMessage());
            mostrarMensaje("ADVERTENCIA: ", "Se produjo un error al cargar las imagenes...", FacesMessage.SEVERITY_WARN);
        }

        return null;
    }

    public String agregarAdjunto(){

        try {
             listaAdjuntos.add(galeria);
             galeria = new SisGaleria();
             getlistarImagenAdjunta();
             activar = true;

        } catch (Exception ex) {
            mostrarMensaje("ADVERTENCIA: ", "Se produjo un error al adjuntar imagen...", FacesMessage.SEVERITY_WARN);
        }
        return null;
    }

    public List<SisGaleria> getlistarImagenAdjunta(){

        return listaAdjuntos;
    }

    //Metodo que permite redimensionar una imagen antes de subirla al servidor.

    public void redimensionaJPG(String ficheroEntrada,String ficheroSalida){

    try{

        BufferedImage input = ImageIO.read(new File(ficheroEntrada));

        int w = input.getWidth(), h = input.getHeight();

        BufferedImage output = new BufferedImage(640*w/w,640*h/w, BufferedImage.TYPE_3BYTE_BGR);

        Graphics2D g = output.createGraphics();

        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        g.drawImage(input,0,0,640*w/w,640*h/w, null);

        ImageIO.write(output, "jpg", new File(ficheroSalida));

    }catch(Exception ex){

        ex.printStackTrace();
    }

    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

}
